// 1.引入基础模块（必须）
import axios from "axios" //vue框架会自动引入安装的第三方模块(node_modules)
import qs from "qs";
import router from "@/router/index.js"
import Vue from "vue"
let vm = new Vue()


// 2.通过node提供的环境常量动态管理服务端请求域名地址
// 动态process.env.NODE_ENV  development  production
let baseURL = ""
if (process.env.NODE_ENV == "development") {
    // baseURL = "http://localhost:3000" //本地服务（测试服务器==>本地 测试服务器==>远程）npm run serve
    baseURL = "https://api.aslegou.top" //为了测试方便使用远程地址
} else {
    baseURL = "https://api.aslegou.top" //生产服务器==>远程 npm run build
    // baseURL = "http://localhost:3000"
}

// 将域名挂载在vue原型链方便后期图片业务使用
Vue.prototype.$pre = baseURL

// 3.创建实例 设置一些常用的配置项 请求基础域名地址 header  请求方法  请求超时（必须）
const http = axios.create({
    baseURL //请求基础域名地址
})


// 4.设置请求拦截（必须）
http.interceptors.request.use((config) => {
    // console.log('请求数据情况：', config)
    // 触发时机：请求出去之前触发
    // 应用场景：再此可以处理请求数据 header头 token
    // 注意，最后放行返回调整好的请求参数
    let userInfo = localStorage.getItem('userInfo') || ""
    if (userInfo != "") {
        config.headers.Authorization = JSON.parse(userInfo).token
    }
    return config
}, () => {})

// 5.设置响应拦截（必须）
http.interceptors.response.use((res) => {
    // 触发时机：请求请求之后，页面获取结果之前触发
    // 应用场景：根据状态码返回不同的请求结果
    if (res.data.code == 200) { //成功
        // 请求操作成功
        return res.data.list
        // return Promise.resolve(res.data.list)
    } else if (res.data.code == 403) { //登录过期 访问的接口不存在
        // 登录过期请重新登录 清除登录缓存信息
        vm.$message({
            message: '登录过期！',
            type: 'warning'
        });
        localStorage.removeItem('userInfo')
        router.replace('/login')
    } else if (res.data.code == 500) { //参数错误，请检查传递的参数
        vm.$message({
            message: res.data.msg,
            type: 'warning'
        });
        return Promise.reject(res)
    }

    //
    // switch (true) { 
    //     case res.data.code == 403:

    //         breack;
    //     case res.data.code == 404:

    //         break;
    //     case res.data.code == 500:

    //         break;
    //     default:
    //         return res.data.list
    // }
}, () => {})


/**
 * 请求标准风格：
 *  restful风格，一种开发接口书写规范（查看：get 提交：post 删除：delete 修改put）
 *  查看：GET    http://www.gookang.com/tasks
 *  提交：POST   http://www.gookang.com/tasks
 *  删除：delete http://www.gookang.com/tasks
 *  修改：put    http://www.gookang.com/tasks
 */

// -------------------------基于项目方式封装：get post-----------------------------------------

// export const request = (method,url,data) => { 
//     if (method == 'GET') {

//     } else { 

//     }
// }


/**
 * 6.功能：基于axios-get方法查询数据
 * 参数：{
 *      url:"请求数据路径",
 *      params:{}请求参数
 * }
 * 返回结果：promise对象
 * */
export const getData = (url, params = {}) => {
    // 返回的是一个promise对象
    return http.get(url, {
        params
    })
}


/**
 * 7.功能：基于post方法提交数据
 * 参数：{
 *      url:"请求数据路径",
 *      params:{}提交参数
 * }
 * 返回结果：promise对象
 * */
export const postData = (url, params = {}, isFile = false, onUploadProgress = function () {}) => {
    // console.log(url, params, isFile, onProcessFn);
    // return;
    // 表单提交数据类型：字段类型数据 文件数据（img file video ）
    // 1.有文件上传(二进制文件流==>Blob) multipart/form-data  FormData()=>window提供构造函数可以上传文件数据和非文件数据
    // new FormData()
    // 2.无文件上传 application/x-www-form-urlencoded; 将对象数据转换成key=value格式
    let data = null; //初始化待提交数据
    if (isFile) {
        data = new FormData()
        for (let key in params) {
            // 组装表单数据 params={pid:0,catename:"测试分类"，img:Blob,status:1}
            data.append(key, params[key])
        }
    } else {
        data = qs.stringify(params)
    }
    // return http.post(url, data)
    return http({
        method: "post",
        url,
        data,
        onUploadProgress
    })
}